package com.zty.component;

import com.zty.config.SmsConfig;
import com.zty.util.CommonUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;

/**
 * @author ZTY
 * @describe
 * @time 2024-01-22 10:48
 * @projectName zty-short-url
 */
@Component
@Slf4j
public class SmsComponent {
    //  发送地址
    private static final String URL_TEMPLATE = "https://gjsms.market.alicloudapi.com/sendgjSms?content=%s&mobile=%s";

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private SmsConfig smsConfig;

    /**
     * 发送短信验证码
     * @param to
     * @param value
     */
    /**
     * @Async失效情况
     *
     *  注解@Async的方法不是public方法
     *
     *  注解@Async的返回值只能为void或者Future
     *
     *  注解@Async方法使用static修饰也会失效
     *
     *  spring无法扫描到异步类，没加注解@Async  或 @EnableAsync注解
     *
     *  调用方与被调方不能在同一个类
     *
     *  Spring 在扫描bean的时候会扫描方法上是否包含@Async注解，动态地生成一个子类（即proxy代理类），当这个有注解的方法被调用的时候，实际上是由代理类来调用的，代理类在调用时增加异步作用
     *  如果这个有注解的方法是被同一个类中的其他方法调用的，那么该方法的调用并没有通过代理类，而是直接通过原来的那个 bean，所以就失效了
     *  所以调用方与被调方不能在同一个类，主要是使用了动态代理，同一个类的时候直接调用，不是通过生成的动态代理类调用
     *  一般将要异步执行的方法单独抽取成一个类
     *  类中需要使用@Autowired或@Resource等注解自动注入，不能自己手动new对象
     *
     *  在Async 方法上标注@Transactional是没用的，但在Async 方法调用的方法上标注@Transactional 是有效的
     */
    @Async("threadPoolTaskExecutor")
    public void send(String to,String templateId,String value){

        long beginTime = CommonUtil.getCurrentTimestamp();

        /*String url = String.format(URL_TEMPLATE,to,templateId,value);
        HttpHeaders headers = new HttpHeaders();
        //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
        headers.set("Authorization","APPCODE "+smsConfig.getAppCode());
        HttpEntity entity = new HttpEntity<>(headers);
        ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
        sdfasdf
        */



        /*long endTime = CommonUtil.getCurrentTimestamp();

        log.info("耗时={},url={},body={}",endTime-beginTime,url,response.getBody());
        if(response.getStatusCode().is2xxSuccessful()){
            log.info("发送短信验证码成功");
        }else {
            log.error("发送短信验证码失败:{}",response.getBody());
        }*/

    }
}
